package com.android.provinciaRestClient.dao.impl;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

import com.android.provinciaRestClient.dao.ProvinciaDao;
import com.android.provinciaRestClient.domain.Provincia;
import com.android.provinciaRestClient.exception.ConexionException;

public class ProvinciaDaoSpring implements ProvinciaDao {

	private String urlString;
	private RestTemplate restTemplate;
	private Provincia[] provincias;

	/**
	 * constructor de la clase.
	 * @param urlServicio url del servicio rest.
	 * @param clienteRest RestTemplate instanciado para conectarse.
	 */
	public ProvinciaDaoSpring(String urlServicio, RestTemplate clienteRest) {
		this.restTemplate = clienteRest;
		this.urlString = urlServicio;
	}

	@Override
	public List<Provincia> buscarTodas() throws ConexionException {

		// Add the Jackson message converter
		restTemplate.getMessageConverters().add(
				new MappingJacksonHttpMessageConverter());

		// Crear la URI
		URI url = crearURI();
		// Ejercitar el metodo.
		try {
			provincias = restTemplate.getForObject(url, Provincia[].class);
		} catch (RestClientException clientException) {
			throw new ConexionException("Excepcion al consultar el servicio");
		}

		List<Provincia> provinciasList = new ArrayList<Provincia>(
				Arrays.asList(provincias));

		return provinciasList;
	}

	/**
	 * @return URI creada a partir del string.
	 * @throws ConexionException
	 */
	private URI crearURI() throws ConexionException {
		URI url;
		try {
			url = new URI(urlString);
		} catch (URISyntaxException e) {
			throw new ConexionException("excepcion al crear la uri "
					+ e.getMessage());
		}
		return url;
	}
}
